﻿using System;
using System.Collections.Generic;
using System.Web;
using BackstageMusiciansFriend;
using DBMethodsNamespace;
using System.IO;
using System.Text;
using ExcelLibrary.SpreadSheet;
using System.Drawing.Imaging;
using System.Net;
using System.Threading;
using ControlTareaPendienteNamespace;
using ControlUsuarioWebNamespace;
using ControlSesionNamespace;
using ControlLogNamespace;

using NPOI.HSSF.UserModel;
using NPOI.HPSF;
using NPOI.POIFS.FileSystem;
using NPOI.SS.UserModel;
using OfficeOpenXml;
using System.Xml;

/// <summary>
/// Summary description for ControlImportacion
/// </summary>
/// 
namespace ControlImportacionNamespace
{
    public class ImportacionException : Exception
    {
        public ImportacionException(string strMessage)
            : base(strMessage)
        {

        }
    }

    public class ControlImportacion
    {
        #region Constant Properties
        public const string ConstIdleMode = "modoIdleTareasImportacion";
        public const string ConstIdleModeValueTRUE = "TRUE";
        public const string ConstIdleModeValueFALSE = "FALSE";
        #endregion


        public const int CantidadMaximaDeFilasAProcesar = 5000;
        private string strFile;
        private string strPath;
        private string strExtension;
        private IImportacionArchivo interfaceImportacion;
        public ControlImportacion()
        {

        }

        public ControlImportacion(string strPathParam, string strFileParam)
        {
            strFile = strFileParam;
            strPath = strPathParam;

            verificarExtensionArchivo(strFileParam);

        }

        private void verificarExtensionArchivo(string strFileNameParam)
        {
            strExtension = System.IO.Path.GetExtension(strFileNameParam);

            if (strExtension == ".csv" || strExtension == ".CSV")
            {
                ControlLog.writeLog("[verificarExtensionArchivo]: Extension CSV verificada OK! ");
                interfaceImportacion = new ControlImportacionCSV();
            }
            else if (strExtension == ".xls" || strExtension == ".XLS")
            {
                ControlLog.writeLog("[verificarExtensionArchivo]: Extension XLS verificada OK! ");
                interfaceImportacion = new ControlImportacionXLS();
            }
            else if (strExtension == ".xlsx" || strExtension == ".XLSX")
            {
                interfaceImportacion = new ControlImportacionXLSX();
                ControlLog.writeLog("[verificarExtensionArchivo]: Extension XLSX verificada OK! ");
            }
            else if (strExtension == ".xlsm" || strExtension == ".XLSM")
            {
                interfaceImportacion = new ControlImportacionXLSX();
                ControlLog.writeLog("[verificarExtensionArchivo]: Extension XLSM verificada OK! ");
            }
            else
            {
                ControlLog.writeLog("[verificarExtensionArchivo]: Extension no valida " + strExtension);
                throw new ImportacionException("Extension de archivo no valida: " + strExtension);
            }
        }

        public string getSavePath()
        {
            return strPath + strFile;
        }

        public void guardarPublicacionesDeArchivoEnDb()
        {
            DBMethods objConnection = new DBMethods();
            try
            {
                foreach (ControlImportacionProductoML objProducto in interfaceImportacion.obtenerPublicacionesDeArchivo(this.getSavePath()))
                {
                    ControlLog.writeLog("[guardarPublicacionesDeArchivoEnDb]: Agregando publicacion " + objProducto.Title);
                    objConnection.agregarPublicacionesPendientes(objProducto, ControlSesion.session(ControlSesion.UsuarioLogin));
                    this.actualizarImagenesDePublicacion(objProducto);
                    foreach (ControlImportacionProductoMLImagen objLinkImagenesRotas in objProducto.obtenerImagenesErroneas())
                    {
                        objConnection.denunciarLinksDeImagenesCorrompidas(objLinkImagenesRotas, objProducto.intIdPublicacion);
                    }
                }
            }
            catch (ImportacionException importEx)
            {
                ControlLog.writeLog("[guardarPublicacionesDeArchivoEnDb]: EXCEPCION de IMPORTACION: " + importEx.Message);
                throw importEx;
            }
            catch (Exception ex)
            {
                ControlLog.writeLog("[guardarPublicacionesDeArchivoEnDb]: EXCEPCION guardando publicaciones en DB: " + ex.Message);
                throw ex;
            }


        }

        public void guardarPublicacionesDeArchivoEnDbParcialmente()
        {
            DBMethods objConnection = new DBMethods();
            try
            {
                interfaceImportacion.obtenerPublicacionesDeArchivoYGuardarEnDb(this.getSavePath(), this);
            }
            catch (ImportacionException importEx)
            {
                ControlLog.writeLog("[guardarPublicacionesDeArchivoEnDbParcialmente]: EXCEPCION de IMPORTACION: " + importEx.Message);
                throw importEx;
            }
            catch (Exception ex)
            {
                ControlLog.writeLog("[guardarPublicacionesDeArchivoEnDbParcialmente]: EXCEPCION guardando publicaciones en DB: " + ex.Message);
                throw ex;
            }


        }


        public void crearCarpetaTemporal(string strCarpeta)
        {
            try
            {
                if (Directory.Exists(strCarpeta) == false)
                {

                    ControlLog.writeLog("[crearCarpetaTemporal] Creando directorio = " + strCarpeta);
                    Directory.CreateDirectory(strCarpeta);
                }
                else
                {
                    ControlLog.writeLog("[crearCarpetaTemporal] Creando directorio = " + strCarpeta);
                }
            }
            catch (Exception Ex)
            {
                ControlLog.writeLog("[crearCarpetaTemporal] Excepcion creando directorio = " + strCarpeta + ":" + Ex.Message);
            }
        }

        public void actualizarImagenesDePublicacion(ControlImportacionProductoML objPublicacion)
        {
            try
            {
                this.descargarImagenes(objPublicacion);
            }
            catch (Exception ex)
            {
                ControlLog.writeLog("[actualizarImagenesDePublicacion] Excepcion creando/ligando imagen a Publicacion=" + ex.Message);
                throw ex;
            }
        }

        public void descargarImagenes(ControlImportacionProductoML objProducto)
        {
            DBMethods objConnection = new DBMethods();
            System.Drawing.Image objImg = null;
            HttpWebRequest objRequestForImage = null;
            WebResponse objResponseForImage = null;
            Stream objStreamForImage = null;

            string strSaveDir = strPath + @"Upload_NewImg_" + ControlSesion.session(ControlSesion.UsuarioLogin) + "\\";
            ControlLog.writeLog("[descargarImagenes] Carpeta de almacenamiento = " + strSaveDir);

            this.crearCarpetaTemporal(strSaveDir);
            int intIndiceImagen = 0;
            List<ControlImportacionProductoMLImagen> lstImagenesDelProducto = objProducto.obtenerImagenes();
            ControlLog.writeLog("[descargarImagenes] Carpeta de almacenamiento = " + strSaveDir + " - Cantidad de Imagenes a Descargar = " + lstImagenesDelProducto.Count.ToString());

            foreach (ControlImportacionProductoMLImagen objImagen in lstImagenesDelProducto)
            {
                try
                {
                    ControlLog.writeLog("[descargarImagenes] IMAGEN #" + intIndiceImagen.ToString() + " - Link de imagen a descargar: " + objImagen.strLinkImagen);
                    objRequestForImage = (HttpWebRequest)HttpWebRequest.Create(objImagen.strLinkImagen);
                    objRequestForImage.AllowWriteStreamBuffering = true;

                    objResponseForImage = objRequestForImage.GetResponse();

                    objStreamForImage = objResponseForImage.GetResponseStream();

                    objImg = System.Drawing.Image.FromStream(objStreamForImage);

                    string strImageFileName = objProducto.intIdPublicacion.ToString().PadLeft(10, '0') + intIndiceImagen.ToString().PadLeft(3, '0') + ".jpg";
                    objImg.Save(strSaveDir + strImageFileName);
                    objImagen.strLinkImagenLocal = strSaveDir + strImageFileName;
                    objConnection.ligarImagenConPublicacion(objProducto, objConnection.agregarImagen(objImagen.strLinkImagen, objImagen.strLinkImagenLocal));


                    objImg.Dispose();
                    objResponseForImage.Close();
                    objStreamForImage.Close();

                }
                catch (WebException webEx)
                {
                    ControlLog.writeLog("[descargarImagenes] WebException = Error descargando imagen. Se ignora esta imagen. Link = " + objImagen.strLinkImagen + " Mensaje: " + webEx.Message + " - Tipo de error " + webEx.Status.ToString());
                    objProducto.agregarImagenErronea(objImagen.strLinkImagen);
                    if (objImg != null)
                    {
                        objImg.Dispose();
                    }
                    if (objResponseForImage != null)
                    {
                        objResponseForImage.Close();
                    }
                    if (objStreamForImage != null)
                    {
                        objStreamForImage.Close();
                    }
                }
                catch (Exception ex)
                {
                    ControlLog.writeLog("[descargarImagenes] Excepcion descargando imagen =  " + objImagen.strLinkImagen + " Mensaje: " + ex.Message);
                    objProducto.agregarImagenErronea(objImagen.strLinkImagen);
                    if (objImg != null)
                    {
                        objImg.Dispose();
                    }
                    if (objResponseForImage != null)
                    {
                        objResponseForImage.Close();
                    }
                    if (objStreamForImage != null)
                    {
                        objStreamForImage.Close();
                    }
                    throw ex;
                }

                intIndiceImagen++;
            }

        }

        public void borrarTemporales()
        {
            try
            {
                File.Delete(this.getSavePath());
            }
            catch (Exception ex)
            {
                ControlLog.writeLog("[borrarDirectoriosTemporales] EXCEPCION Borrando archivo " + this.getSavePath() + " = " + ex.Message);
            }

        }



        public static void borrarPendientes(string strUsuarioParam)
        {
            DBMethods objConnection = new DBMethods();
            try
            {
                List<ControlImportacionProductoML> lstProducto = objConnection.obtenerPublicacionesPendientes(ControlSesion.session(ControlSesion.UsuarioLogin));
                ControlLog.writeLog("[borrarPendientes] Cantidad de Publicaciones Pendientes a Borrar de usuario = " + ControlSesion.session(ControlSesion.UsuarioLogin) + "  =" + lstProducto.Count.ToString());
                foreach (ControlImportacionProductoML objProducto in lstProducto)
                {
                    ControlLog.writeLog("[borrarPendientes] Borrando Publicacion ID en Administrador = " + objProducto.intIdPublicacion.ToString());
                    objConnection.borrarPublicacionPendienteEnElAdministrador(objProducto.intIdPublicacion.ToString());
                    ControlLog.writeLog("[borrarPendientes] Borrando Publicacion ID = " + objProducto.intIdPublicacion.ToString());
                    objConnection.borrarPublicacionPendiente(objProducto.intIdPublicacion.ToString());
                    ControlLog.writeLog("[borrarPendientes] Borrando Imagenes de Publicacion ID = " + objProducto.intIdPublicacion.ToString());
                    objConnection.borrarImagenesDePublicacionPendiente(objProducto.intIdPublicacion.ToString());
                    ControlLog.writeLog("[borrarPendientes] Borrando Imagenes Huerfanas");
                    objConnection.borrarImagenesHuerfanas();
                }
            }
            catch (Exception ex)
            {
                ControlLog.writeLog("[borrarPendientes] Excepcion borrando productos pendientes:" + ex.Message);
            }
        }
    }


    public class ControlImportacionAsyncHandler : System.Web.IHttpAsyncHandler
    {
        public static string strMensajeDeError;

        TareaPendiente objTareaARealizar;
        private AsyncTaskDelegate del;
        private AsyncTaskDelegate delTest;
        protected delegate void AsyncTaskDelegate(HttpContext context);
        ControlImportacion objHandlerImportacion;


        public ControlImportacionAsyncHandler()
        {

        }

        public void ProcessRequest(HttpContext context)
        {
            try
            {
                // objHandlerImportacion.guardarPublicacionesDeArchivoEnDb();
                objHandlerImportacion.guardarPublicacionesDeArchivoEnDbParcialmente();
                ControlLog.writeLog("[ControlImportacionAsyncHandler:ProcessRequest] Se guardo publicaciones en DB como PENDIENTES");
                objHandlerImportacion.borrarTemporales();
                ControlLog.writeLog("[ControlImportacionAsyncHandler:ProcessRequest] Importacion finalizada OK");
            }
            catch (ImportacionException importEx)
            {
                ControlLog.writeLog("[ControlImportacionAsyncHandler:ProcessRequest] EXCEPCION de Importacion: " + importEx.Message);
                objTareaARealizar.actualizarEstado(importEx.Message, "ERROR");
                Thread.Sleep(60000);
            }
            catch (Exception ex)
            {
                ControlLog.writeLog("[ControlImportacionAsyncHandler:ProcessRequest] Excepcion Procesando Tarea de Importacion: " + ex.Message);
            }
        }


        public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object obj)
        {
            this.del = new AsyncTaskDelegate(ProcessRequest);
            objHandlerImportacion = (ControlImportacion)obj;
            AsyncCallback objCallBack = new AsyncCallback(callbackImportacion);
            objTareaARealizar = new TareaPendiente();
            objTareaARealizar.crearTarea(ControlSesion.session(ControlSesion.UsuarioLogin), "Importaciones", "Importando archivo " + objHandlerImportacion.getSavePath() + " [" + System.DateTime.Now.ToString() + "]");
            return del.BeginInvoke(context, objCallBack, obj);


        }

        public void ProcessRequestTest(HttpContext context)
        {
            try
            {
                strMensajeDeError = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
                ControlLog.writeLog("[ControlImportacionAsyncHandler:ProcessRequestTest] Soy " + System.Security.Principal.WindowsIdentity.GetCurrent().Name);
            }
            catch (Exception ex)
            {
                strMensajeDeError = " Excepcion = " + ex.Message;
            }
        }

        public IAsyncResult BeginProcessRequestTest(HttpContext context, AsyncCallback cb, object obj)
        {
            this.delTest = new AsyncTaskDelegate(ProcessRequestTest);


            IAsyncResult objResult = delTest.BeginInvoke(context, null, obj);

            Thread.Sleep(10000);
            ControlLog.writeLog("[ControlImportacionAsyncHandler:BeginProcessRequestTest] strMensajeDeError=" + strMensajeDeError);
            return objResult;
        }

        private void callbackImportacion(IAsyncResult ar)
        {
            try
            {
                this.EndProcessRequest(ar);
                //   objTareaARealizar.finalizar();
                objTareaARealizar.actualizarEstado("Tarea terminada", "END_VISIBLE");
                ControlLog.writeLog("[ControlImportacionAsyncHandler:callbackImportacion] Liberando UNICA INSTANCIA...");
            }
            catch (ImportacionException ex)
            {
                ControlLog.writeLog("[ControlImportacionAsyncHandler:callbackImportacion] Excepcion finalizando tarea: " + ex.Message);
            }
        }

        public void EndProcessRequest(IAsyncResult ar)
        {
            try
            {
                ControlLog.writeLog("[ControlImportacionAsyncHandler:EndProcessRequest] EndProcess llamado correctamente ");
                this.del.EndInvoke(ar);
            }
            catch (Exception ex)
            {
                ControlLog.writeLog("[ControlImportacionAsyncHandler:EndProcessRequest] Excepcion en EndProcess = " + ex.Message);
                throw ex;
            }
        }

        public bool IsReusable { get { return true; } }
    }

    enum EstadoPublicacion
    {
        Pendiente = 1,
        Publicada = 2
    }


    public interface IImportacionArchivo
    {
        int obtenerCantidadDePublicaciones();
        List<ControlImportacionProductoML> obtenerPublicacionesDeArchivo(string strFileNamePathParam);
        void obtenerPublicacionesDeArchivoYGuardarEnDb(string strFileNamePathParam, ControlImportacion HandlerParam);
    }

    public class ControlImportacionCSV : IImportacionArchivo
    {
        public int obtenerCantidadDePublicaciones()
        {
            throw new NotImplementedException();
        }

        public void obtenerPublicacionesDeArchivoYGuardarEnDb(string strFileNamePathParam, ControlImportacion HandlerParam)
        {
            string strLinea;
            int i = 0;

            ControlLog.writeLog("[ControlImportacionCSV:obtenerPublicacionesDeArchivoYGuardarEnDb] FilePath de Productos a autopublicar = " + strFileNamePathParam);

            FileStream objStream;
            StreamReader objReader;
            try
            {
                objStream = new FileStream(strFileNamePathParam, FileMode.Open, FileAccess.Read);
                objReader = new StreamReader(objStream, Encoding.GetEncoding("iso-8859-1")/*, Encoding.UTF8 */);
            }
            catch (Exception ex)
            {
                ControlLog.writeLog("[ControlImportacionCSV:obtenerPublicacionesDeArchivoYGuardarEnDb] Error accediendo a archivo de importacion " + strFileNamePathParam + " - Mensaje: " + ex.Message);
                throw ex;
            }


            try
            {
                Dictionary<string, int> dicIndicesColumnas = null;

                do
                {
                    strLinea = objReader.ReadLine();

                    if (strLinea == null)
                    {
                        ControlLog.writeLog("[ControlImportacionCSV:obtenerPublicacionesDeArchivoYGuardarEnDb] Linea es NULL!!!!!");
                        break;
                    }

                    if (strLinea.StartsWith("Price")) //HZ Linea Header
                    {
                        ControlLog.writeLog("[ControlImportacionCSV:obtenerPublicacionesDeArchivoYGuardarEnDb] Fila de TITULOS de COLUMNA");
                        dicIndicesColumnas = ControlImportacionProductoML.resolverIndicesDeColumnas(strLinea);
                        continue;
                    }
                    else if (strLinea.StartsWith("$"))  //HZ : Tiene que empezar si o si con signo $, si no no es una publicacion válida.
                    {
                        ControlLog.writeLog("[ControlImportacionCSV:obtenerPublicacionesDeArchivoYGuardarEnDb] Fila de INFO");
                        ControlImportacionProductoML objProductoNuevo = ControlImportacionProductoML.convertirLineaAProducto(strLinea, dicIndicesColumnas);
                        ControlLog.writeLog("[ControlImportacionCSV:obtenerPublicacionesDeArchivoYGuardarEnDb]: Agregando publicacion " + objProductoNuevo.Title);

                        DBMethods objConnection = new DBMethods();

                        objConnection.agregarPublicacionesPendientes(objProductoNuevo, ControlSesion.session(ControlSesion.UsuarioLogin));
                        HandlerParam.actualizarImagenesDePublicacion(objProductoNuevo);
                        foreach (ControlImportacionProductoMLImagen objLinkImagenesRotas in objProductoNuevo.obtenerImagenesErroneas())
                        {
                            objConnection.denunciarLinksDeImagenesCorrompidas(objLinkImagenesRotas, objProductoNuevo.intIdPublicacion);
                        }
                    }
                    else
                    {
                        ControlLog.writeLog("[ControlImportacionCSV:obtenerPublicacionesDeArchivoYGuardarEnDb] Fila NO EMPIEZA CON $, se considera la ultima");
                        break;
                    }

                }
                while (strLinea != null);

            }
            catch (Exception Ex)
            {
                ControlLog.writeLog("[ControlImportacionCSV:obtenerPublicacionesDeArchivoYGuardarEnDb] Excepcion = " + Ex.Message);
                throw Ex;
            }
            finally
            {
                if (objReader != null)
                    objReader.Close();
            }



        }

        public List<ControlImportacionProductoML> obtenerPublicacionesDeArchivo(string strFileNamePathParam)
        {
            string strLinea;
            List<ControlImportacionProductoML> lstProductosNuevos = new List<ControlImportacionProductoML>();
            int i = 0;

            ControlLog.writeLog("[ControlImportacionCSV:obtenerPublicacionesDeArchivo] FilePath de Productos a autopublicar = " + strFileNamePathParam);

            FileStream objStream;
            StreamReader objReader;
            try
            {
                objStream = new FileStream(strFileNamePathParam, FileMode.Open, FileAccess.Read);
                objReader = new StreamReader(objStream, Encoding.GetEncoding("iso-8859-1")/*, Encoding.UTF8 */);
            }
            catch (Exception ex)
            {
                ControlLog.writeLog("[ControlImportacionCSV:obtenerPublicacionesDeArchivo] Error accediendo a archivo de importacion " + strFileNamePathParam + " - Mensaje: " + ex.Message);
                throw ex;
            }


            try
            {
                Dictionary<string, int> dicIndicesColumnas = null;

                do
                {
                    strLinea = objReader.ReadLine();

                    if (strLinea == null)
                    {
                        ControlLog.writeLog("[ControlImportacionCSV:obtenerPublicacionesDeArchivo] Linea es NULL!!!!!");
                        break;
                    }

                    if (strLinea.StartsWith("Price")) //HZ Linea Header
                    {
                        ControlLog.writeLog("[ControlImportacionCSV:obtenerPublicacionesDeArchivo] Fila de TITULOS de COLUMNA");
                        dicIndicesColumnas = ControlImportacionProductoML.resolverIndicesDeColumnas(strLinea);
                        continue;
                    }
                    else if (strLinea.StartsWith("$"))  //HZ : Tiene que empezar si o si con signo $, si no no es una publicacion válida.
                    {
                        ControlLog.writeLog("[ControlImportacionCSV:obtenerPublicacionesDeArchivo] Fila de INFO");
                        ControlImportacionProductoML objProductoNuevo = ControlImportacionProductoML.convertirLineaAProducto(strLinea, dicIndicesColumnas);
                        lstProductosNuevos.Add(objProductoNuevo);
                    }
                    else
                    {
                        ControlLog.writeLog("[ControlImportacionCSV:obtenerPublicacionesDeArchivo] Fila NO EMPIEZA CON $, se considera la ultima");
                        break;
                    }

                }
                while (strLinea != null);

            }
            catch (Exception Ex)
            {
                ControlLog.writeLog("[ControlImportacionCSV:obtenerPublicacionesDeArchivo] Excepcion = " + Ex.Message);
                throw Ex;
            }
            finally
            {
                if (objReader != null)
                    objReader.Close();
            }

            ControlLog.writeLog("[ControlImportacionCSV:obtenerPublicacionesDeArchivo] Productos devueltos OK! (Productos en lista = " + lstProductosNuevos.Count + ")");
            return lstProductosNuevos;
        }
    }

    public class ControlImportacionXLS : IImportacionArchivo
    {

        public int obtenerCantidadDePublicaciones()
        {
            throw new NotImplementedException();
        }

        public void obtenerPublicacionesDeArchivoYGuardarEnDb(string strFileNamePathParam, ControlImportacion HandlerParam)
        {
            Dictionary<string, int> dicIndicesColumnas = null;
            ControlLog.writeLog("[ControlImportacionXLS:obtenerPublicacionesDeArchivoYGuardarEnDb] FilePath de Productos a autopublicar = " + strFileNamePathParam);
            try
            {
                FileStream objStream = new FileStream(strFileNamePathParam, FileMode.Open, FileAccess.Read);
                HSSFWorkbook objWorkBook = new HSSFWorkbook(objStream);
                try
                {
                    string strTestSheet = objWorkBook.GetSheet("Importacion").FirstRowNum.ToString();
                }
                catch (Exception ex)
                {
                    throw new ImportacionException("No se encontro la hoja \"Importacion\" en el Excel indicado");
                }

                ControlLog.writeLog("[ControlImportacionXLS:obtenerPublicacionesDeArchivoYGuardarEnDb] Cantidad de Filas Inicial=" + objWorkBook.GetSheet("Importacion").FirstRowNum.ToString() + " Final= " + objWorkBook.GetSheet("Importacion").LastRowNum.ToString());
                for (int intFilaIndice = objWorkBook.GetSheet("Importacion").FirstRowNum; intFilaIndice <= objWorkBook.GetSheet("Importacion").LastRowNum; intFilaIndice++)
                {
                    ControlLog.writeLog("[ControlImportacionXLS:obtenerPublicacionesDeArchivoYGuardarEnDb] Analizando XLS Fila=" + intFilaIndice.ToString());

                    if (objWorkBook.GetSheet("Importacion").GetRow(intFilaIndice).GetCell(0) == null)
                    {
                        ControlLog.writeLog("[ControlImportacionXLS:obtenerPublicacionesDeArchivoYGuardarEnDb] Fila NULL");
                        continue;
                    }


                    if (objWorkBook.GetSheet("Importacion").GetRow(intFilaIndice).GetCell(0).StringCellValue.StartsWith("Price"))
                    {
                        ControlLog.writeLog("[ControlImportacionXLS:obtenerPublicacionesDeArchivoYGuardarEnDb] Fila de Precio");
                        dicIndicesColumnas = ControlImportacionProductoML.resolverIndicesDeColumnas(objWorkBook.GetSheet("Importacion").GetRow(intFilaIndice));
                        continue;
                    }

                    if (objWorkBook.GetSheet("Importacion").GetRow(intFilaIndice).GetCell(0).StringCellValue.StartsWith("$"))
                    {
                        ControlLog.writeLog("[ControlImportacionXLS:obtenerPublicacionesDeArchivoYGuardarEnDb] Fila de INFO");
                        ControlImportacionProductoML objProductoNuevo = ControlImportacionProductoML.convertirLineaAProducto(objWorkBook.GetSheet("Importacion").GetRow(intFilaIndice), dicIndicesColumnas);
                        ControlLog.writeLog("[ControlImportacionXLS:obtenerPublicacionesDeArchivoYGuardarEnDb]: Agregando publicacion " + objProductoNuevo.Title);

                        DBMethods objConnection = new DBMethods();

                        objConnection.agregarPublicacionesPendientes(objProductoNuevo, ControlSesion.session(ControlSesion.UsuarioLogin));
                        HandlerParam.actualizarImagenesDePublicacion(objProductoNuevo);
                        foreach (ControlImportacionProductoMLImagen objLinkImagenesRotas in objProductoNuevo.obtenerImagenesErroneas())
                        {
                            objConnection.denunciarLinksDeImagenesCorrompidas(objLinkImagenesRotas, objProductoNuevo.intIdPublicacion);
                        }
                        continue;
                    }


                }

            }
            catch (ImportacionException outerImportEx)
            {
                throw outerImportEx; //No pongo writeLog por que lo lance arriba y lo escribi arriba...
            }
            catch (Exception ex)
            {
                ControlLog.writeLog("[ControlImportacionXLS:obtenerPublicacionesDeArchivoYGuardarEnDb] Excepcion levantando .XLS =" + ex.Message);
            }


        }

        public List<ControlImportacionProductoML> obtenerPublicacionesDeArchivo(string strFileNamePathParam)
        {

            List<ControlImportacionProductoML> lstProductosNuevos = new List<ControlImportacionProductoML>();
            Dictionary<string, int> dicIndicesColumnas = null;
            ControlLog.writeLog("[ControlImportacionXLS:obtenerPublicacionesDeArchivo] FilePath de Productos a autopublicar = " + strFileNamePathParam);
            try
            {
                FileStream objStream = new FileStream(strFileNamePathParam, FileMode.Open, FileAccess.Read);
                HSSFWorkbook objWorkBook = new HSSFWorkbook(objStream);
                try
                {
                    string strTestSheet = objWorkBook.GetSheet("Importacion").FirstRowNum.ToString();
                }
                catch (Exception ex)
                {
                    throw new ImportacionException("No se encontro la hoja \"Importacion\" en el Excel indicado");
                }

                ControlLog.writeLog("[ControlImportacionXLS:obtenerPublicacionesDeArchivo] Cantidad de Filas Inicial=" + objWorkBook.GetSheet("Importacion").FirstRowNum.ToString() + " Final= " + objWorkBook.GetSheet("Importacion").LastRowNum.ToString());
                for (int intFilaIndice = objWorkBook.GetSheet("Importacion").FirstRowNum; intFilaIndice <= objWorkBook.GetSheet("Importacion").LastRowNum; intFilaIndice++)
                {
                    ControlLog.writeLog("[ControlImportacionXLS:obtenerPublicacionesDeArchivo] Analizando XLS Fila=" + intFilaIndice.ToString());

                    if (objWorkBook.GetSheet("Importacion").GetRow(intFilaIndice).GetCell(0) == null)
                    {
                        ControlLog.writeLog("[ControlImportacionXLS:obtenerPublicacionesDeArchivo] Fila NULL");
                        continue;
                    }


                    if (objWorkBook.GetSheet("Importacion").GetRow(intFilaIndice).GetCell(0).StringCellValue.StartsWith("Price"))
                    {
                        ControlLog.writeLog("[ControlImportacionXLS:obtenerPublicacionesDeArchivo] Fila de Precio");
                        dicIndicesColumnas = ControlImportacionProductoML.resolverIndicesDeColumnas(objWorkBook.GetSheet("Importacion").GetRow(intFilaIndice));
                        continue;
                    }

                    if (objWorkBook.GetSheet("Importacion").GetRow(intFilaIndice).GetCell(0).StringCellValue.StartsWith("$"))
                    {
                        ControlLog.writeLog("[ControlImportacionXLS:obtenerPublicacionesDeArchivo] Fila de INFO");
                        ControlImportacionProductoML objProductoNuevo = ControlImportacionProductoML.convertirLineaAProducto(objWorkBook.GetSheet("Importacion").GetRow(intFilaIndice), dicIndicesColumnas);
                        lstProductosNuevos.Add(objProductoNuevo);
                        continue;
                    }


                }

            }
            catch (ImportacionException outerImportEx)
            {
                throw outerImportEx; //No pongo writeLog por que lo lance arriba y lo escribi arriba...
            }
            catch (Exception ex)
            {
                ControlLog.writeLog("[ControlImportacionXLS:obtenerPublicacionesDeArchivo] Excepcion levantando .XLS =" + ex.Message);
            }


            ControlLog.writeLog("[ControlImportacionXLS:obtenerPublicacionesDeArchivo] Productos devueltos OK! (Productos en lista = " + lstProductosNuevos.Count + ")");
            return lstProductosNuevos;
        }
    }

    public class ControlImportacionXLSX : IImportacionArchivo
    {

        public int obtenerCantidadDePublicaciones()
        {
            throw new NotImplementedException();
        }

        public void obtenerPublicacionesDeArchivoYGuardarEnDb(string strFileNamePathParam, ControlImportacion HandlerParam)
        {
            bool boolHojaImportacionEncontrada = false;
            Dictionary<string, int> dicIndicesColumnas = null;
            ControlLog.writeLog("[ControlImportacionXLSX:obtenerPublicacionesDeArchivoYGuardarEnDb] FilePath de Productos a autopublicar = " + strFileNamePathParam);
            try
            {

                FileInfo objFile = new FileInfo(strFileNamePathParam);

                using (ExcelPackage objPackage = new ExcelPackage(objFile))
                {

                    foreach (ExcelWorksheet objWorkSheet in objPackage.Workbook.Worksheets)
                    {
                        if (objWorkSheet.Name == "Importacion")
                        {
                            boolHojaImportacionEncontrada = true;
                            for (int intFilaIndice = 1; intFilaIndice < ControlImportacion.CantidadMaximaDeFilasAProcesar; intFilaIndice++)
                            {
                                if (objWorkSheet.Cell(intFilaIndice, 1).Value == null)
                                {
                                    break;
                                }


                                if (objWorkSheet.Cell(intFilaIndice, 1).Value.StartsWith("Price"))
                                {
                                    dicIndicesColumnas = ControlImportacionProductoML.resolverIndicesDeColumnas(objWorkSheet, intFilaIndice);

                                    continue;
                                }

                                if (objWorkSheet.Cell(intFilaIndice, 1).Value.StartsWith("$"))
                                {
                                    ControlLog.writeLog("[ControlImportacionXLSX:obtenerPublicacionesDeArchivoYGuardarEnDb] Fila de INFO");
                                    ControlImportacionProductoML objProductoNuevo = ControlImportacionProductoML.convertirLineaAProducto(objWorkSheet, intFilaIndice, dicIndicesColumnas);
                                    ControlLog.writeLog("[ControlImportacionXLSX:obtenerPublicacionesDeArchivoYGuardarEnDb]: Agregando publicacion " + objProductoNuevo.Title);

                                    DBMethods objConnection = new DBMethods();

                                    objConnection.agregarPublicacionesPendientes(objProductoNuevo, ControlSesion.session(ControlSesion.UsuarioLogin));
                                    HandlerParam.actualizarImagenesDePublicacion(objProductoNuevo);
                                    foreach (ControlImportacionProductoMLImagen objLinkImagenesRotas in objProductoNuevo.obtenerImagenesErroneas())
                                    {
                                        objConnection.denunciarLinksDeImagenesCorrompidas(objLinkImagenesRotas, objProductoNuevo.intIdPublicacion);
                                    }
                                    continue;
                                }


                            }
                        }
                    }

                    if (boolHojaImportacionEncontrada == false)
                    {
                        throw new ImportacionException("No se encontro la hoja \"Importacion\" en el Excel indicado");
                    }
                }

            }
            catch (ImportacionException outerImportEx)
            {
                throw outerImportEx; //No pongo writeLog por que lo lance arriba y lo escribi arriba...
            }
            catch (Exception ex)
            {
                ControlLog.writeLog("[ControlImportacionXLSX:obtenerPublicacionesDeArchivoYGuardarEnDb] Excepcion levantando .XLSX =" + ex.Message);
            }

        }

        public List<ControlImportacionProductoML> obtenerPublicacionesDeArchivo(string strFileNamePathParam)
        {
            bool boolHojaImportacionEncontrada = false;
            List<ControlImportacionProductoML> lstProductosNuevos = new List<ControlImportacionProductoML>();
            Dictionary<string, int> dicIndicesColumnas = null;
            ControlLog.writeLog("[ControlImportacionXLSX:obtenerPublicacionesDeArchivo] FilePath de Productos a autopublicar = " + strFileNamePathParam);
            try
            {

                FileInfo objFile = new FileInfo(strFileNamePathParam);

                using (ExcelPackage objPackage = new ExcelPackage(objFile))
                {

                    foreach (ExcelWorksheet objWorkSheet in objPackage.Workbook.Worksheets)
                    {
                        if (objWorkSheet.Name == "Importacion")
                        {
                            boolHojaImportacionEncontrada = true;
                            for (int intFilaIndice = 1; intFilaIndice < ControlImportacion.CantidadMaximaDeFilasAProcesar; intFilaIndice++)
                            {
                                if (objWorkSheet.Cell(intFilaIndice, 1).Value == null)
                                {
                                    break;
                                }


                                if (objWorkSheet.Cell(intFilaIndice, 1).Value.StartsWith("Price"))
                                {
                                    dicIndicesColumnas = ControlImportacionProductoML.resolverIndicesDeColumnas(objWorkSheet, intFilaIndice);

                                    continue;
                                }

                                if (objWorkSheet.Cell(intFilaIndice, 1).Value.StartsWith("$"))
                                {
                                    ControlLog.writeLog("[ControlImportacionXLS:obtenerPublicacionesDeArchivo] Fila de INFO");
                                    ControlImportacionProductoML objProductoNuevo = ControlImportacionProductoML.convertirLineaAProducto(objWorkSheet, intFilaIndice, dicIndicesColumnas);
                                    lstProductosNuevos.Add(objProductoNuevo);
                                    continue;
                                }


                            }
                        }
                    }

                    if (boolHojaImportacionEncontrada == false)
                    {
                        throw new ImportacionException("No se encontro la hoja \"Importacion\" en el Excel indicado");
                    }
                }

            }
            catch (ImportacionException outerImportEx)
            {
                throw outerImportEx; //No pongo writeLog por que lo lance arriba y lo escribi arriba...
            }
            catch (Exception ex)
            {
                ControlLog.writeLog("[ControlImportacionXLSX:obtenerPublicacionesDeArchivo] Excepcion levantando .XLSX =" + ex.Message);
            }



            ControlLog.writeLog("[ControlImportacionXLSX:obtenerPublicacionesDeArchivo] Productos devueltos OK! (Productos en lista = " + lstProductosNuevos.Count + ")");
            return lstProductosNuevos;
        }
    }


    public class ControlImportacionProductoML
    {

        private string price;
        private string title;
        private string header;
        private string description;
        private string features;
        private string specifications;
        private string bottom;
        private string images;
        private List<ControlImportacionProductoMLImagen> lstImagen;
        private List<ControlImportacionProductoMLImagen> lstImagenErroneas;
        private string marquee_1;
        private string marquee_2;
        private string marquee_3;
        private string marquee_4;
        private string marquee_5;
        private string marquee_6;
        private string marquee_7;
        private string marquee_8;
        private string marquee_9;
        private string marquee_10;
        private string text_1;
        private string text_2;
        private string text_3;
        private string subtitle;
        private string quantity;
        private string categoria;
        private string descriptionTitle;
        private string featureTitle;
        private string specificationsTitle;
        private string videoLinkYouTube;
        private string condition;
        private string htmlDescription;
        public bool htmlMode;
        private TipoMoneda currency;

        public ControlImportacionProductoML()
        {
            lstImagen = new List<ControlImportacionProductoMLImagen>();
            lstImagenErroneas = new List<ControlImportacionProductoMLImagen>();
            htmlMode = false;
        }

        public void DoPriceProcess()
        {

            ControlLog.writeLog("[DoPriceProcess] Input = " + this.price);
            string strPriceParam = this.price;
            if (strPriceParam.Contains(","))
            {
                strPriceParam = strPriceParam.Replace(',', '.');
                ControlLog.writeLog("[DoPriceProcess] Replace modification  = " + strPriceParam);
            }
            if (strPriceParam.Contains("."))
            {
                ControlLog.writeLog("[DoPriceProcess] IndexOf . = " + strPriceParam.IndexOf('.').ToString() + " - Longitud = " + strPriceParam.Length.ToString() + " - Diferencia:" + (strPriceParam.Length - strPriceParam.IndexOf('.')).ToString());
                if ((strPriceParam.Length - strPriceParam.IndexOf('.')) > 3)
                {
                    strPriceParam = strPriceParam.Substring(0, strPriceParam.IndexOf('.') + 3);
                    ControlLog.writeLog("[DoPriceProcess] More modification  = " + strPriceParam);
                }
                else if ((strPriceParam.Length - strPriceParam.IndexOf('.')) < 3)
                {
                    strPriceParam = strPriceParam.PadRight(strPriceParam.Length + (3 - (strPriceParam.Length - strPriceParam.IndexOf('.'))), '0');
                    ControlLog.writeLog("[DoPriceProcess] Less modification  = " + strPriceParam);
                }
            }
            else
            {
                strPriceParam += ".00";
                ControlLog.writeLog("[DoPriceProcess] Decimal modification  = " + strPriceParam);
            }


            ControlLog.writeLog("[DoPriceProcess] Output = " + strPriceParam);
            this.price = strPriceParam;
        }

        public List<ControlImportacionProductoMLImagen> obtenerImagenes()
        {
            ControlLog.writeLog("[obtenerImagenes]: Cantidad de imagenes en la publicacion: " + lstImagen.Count.ToString());
            return lstImagen;
        }
        public void guardarImagenes(List<ControlImportacionProductoMLImagen> lstImagenes)
        {
            lstImagen = lstImagenes;
            images = String.Empty;
            foreach (ControlImportacionProductoMLImagen img in lstImagen)
            {
                images += img.strLinkImagen + " , ";
            }
        }

        public List<ControlImportacionProductoMLImagen> obtenerImagenesErroneas()
        {
            return lstImagenErroneas;
        }


        #region Accesser Protocol

        public string VideoLinkYouTube
        {
            get { return videoLinkYouTube; }
            set { videoLinkYouTube = value; }
        }

        public string Condicion
        {
            get { return condition; }
            set { condition = value; }
        }
        public string HtmlDescription
        {
            get { return htmlDescription; }
            set { htmlDescription = value; }
        }
        public string DescriptionTitle
        {
            get { return descriptionTitle; }
            set { descriptionTitle = value; }
        }
        public string FeatureTitle
        {
            get { return featureTitle; }
            set { featureTitle = value; }
        }
        public string SpecificationsTitle
        {
            get { return specificationsTitle; }
            set { specificationsTitle = value; }
        }


        public string Price
        {
            get { return price; }
            set { price = value; }
        }
        public string Title
        {
            get { return title; }
            set { title = value; }
        }
        public string Categoria
        {
            get { return categoria; }
            set { categoria = value; }
        }
        public string Header
        {
            get { return header; }
            set
            {

                if (value == "N/D")
                    header = String.Empty;
                else
                    header = value;
            }
        }
        public string Description
        {
            get { return description; }
            set { description = value; }
        }
        public string Features
        {
            get { return features; }
            set
            {
                if (value == "N/D")
                    features = String.Empty;

                else
                    features = value;
            }
        }
        public string Specifications
        {
            get { return specifications; }
            set
            {
                if (value == "N/D")
                    specifications = String.Empty;
                else
                    specifications = value;
            }
        }
        public string Bottom
        {
            get { return bottom; }
            set
            {
                if (value == "N/D")
                    bottom = String.Empty;
                else
                    bottom = value;
            }
        }
        public string Images
        {
            get { return images; }
            set
            {
                //string[] strArrLinkImagenes = value.Split(new char[] { ',' });

                // ControlLog.writeLog("[ControlImportacionProductoDb:Images(Get)] Se encontraron " + strArrLinkImagenes.Length.ToString() + " links de Imagenes");

                //foreach (string strLinkImagen in strArrLinkImagenes)
                //{
                //    ControlImportacionProductoMLImagen objImagen = new ControlImportacionProductoMLImagen();
                //    objImagen.strLinkImagen = strLinkImagen;
                //    objImagen.strLinkImagenLocal = null;
                //    lstImagen.Add(objImagen);
                //}

                //images = value; 

                //HZ v2.2.2.0 23/08/2012
                XmlDocument xDoc = new XmlDocument();
                xDoc.LoadXml(value);
                XmlNodeList imagenes = xDoc.GetElementsByTagName("img");

                XmlNodeList lista = ((XmlElement)imagenes[0]).GetElementsByTagName("i");
                ControlLog.writeLog("[ControlImportacionProductoDb:Images(Get)] Se encontraron " + lista.Count.ToString() + " links de Imagenes");

                foreach (XmlNode linkImagen in lista)
                {
                    ControlLog.writeLog("[ControlImportacionProductoDb:Images(Get)] Image string is = " + linkImagen.InnerText);
                    ControlImportacionProductoMLImagen objImagen = new ControlImportacionProductoMLImagen();
                    objImagen.strLinkImagen = linkImagen.InnerText;
                    objImagen.strLinkImagenLocal = null;
                    lstImagen.Add(objImagen);
                }

                images = value;

            }
        }
        public string Marquee_1
        {
            get { return marquee_1; }
            set
            {
                if (value == "N/D")
                    marquee_1 = String.Empty;
                else
                    marquee_1 = value;
            }
        }
        public string Marquee_2
        {
            get { return marquee_2; }
            set
            {
                if (value == "N/D")
                    marquee_2 = String.Empty;
                else
                    marquee_2 = value;
            }
        }
        public string Marquee_3
        {
            get { return marquee_3; }
            set
            {
                if (value == "N/D")
                    marquee_3 = String.Empty;
                else
                    marquee_3 = value;
            }
        }
        public string Marquee_4
        {
            get { return marquee_4; }
            set
            {
                if (value == "N/D")
                    marquee_4 = String.Empty;
                else
                    marquee_4 = value;
            }
        }
        public string Marquee_5
        {
            get { return marquee_5; }
            set
            {
                if (value == "N/D")
                    marquee_5 = String.Empty;
                else
                    marquee_5 = value;
            }
        }
        public string Marquee_6
        {
            get { return marquee_6; }
            set
            {
                if (value == "N/D")
                    marquee_6 = String.Empty;
                else
                    marquee_6 = value;
            }
        }
        public string Marquee_7
        {
            get { return marquee_7; }
            set
            {
                if (value == "N/D")
                    marquee_7 = String.Empty;
                else
                    marquee_7 = value;
            }
        }
        public string Marquee_8
        {
            get { return marquee_8; }
            set
            {
                if (value == "N/D")
                    marquee_8 = String.Empty;
                else
                    marquee_8 = value;
            }
        }
        public string Marquee_9
        {
            get { return marquee_9; }
            set
            {
                if (value == "N/D")
                    marquee_9 = String.Empty;
                else
                    marquee_9 = value;
            }
        }
        public string Marquee_10
        {
            get { return marquee_10; }
            set
            {
                if (value == "N/D")
                    marquee_10 = String.Empty;
                else
                    marquee_10 = value;
            }
        }
        public string Text_1
        {
            get { return text_1; }
            set
            {
                if (value == "N/D")
                    text_1 = String.Empty;
                else
                    text_1 = value;
            }
        }
        public string Text_2
        {
            get { return text_2; }
            set
            {
                if (value == "N/D")
                    text_2 = String.Empty;
                else
                    text_2 = value;
            }
        }
        public string Text_3
        {
            get { return text_3; }
            set
            {
                if (value == "N/D")
                    text_3 = String.Empty;
                else
                    text_3 = value;
            }
        }
        public string Subtitle
        {
            get { return subtitle; }
            set { subtitle = value; }
        }
        public string Quantity
        {
            get { return quantity; }
            set { quantity = value; }
        }
        public void setCurrency(string value)
        {
            if (value == "1" || value == "ARS")
                currency = TipoMoneda.MonedaPesosARG;
            else
                currency = TipoMoneda.MonedaDolarUSD;
        }
        public string getCurrency()
        {
            if (currency == TipoMoneda.MonedaPesosARG)
                return "ARS";
            else
                return "USD";
        }

        private int _intIdPublicacion;

        public int intIdPublicacion
        {
            get { return _intIdPublicacion; }
            set { _intIdPublicacion = value; }
        }

        #endregion

        public static Dictionary<string, int> resolverIndicesDeColumnas(string strNombresColumnasParam)
        {
            Dictionary<string, int> dicIndices = new Dictionary<string, int>();
            try
            {
                string[] strArrSplitString = strNombresColumnasParam.Split(new char[] { ';' });
                int intIndiceColumna = 0;
                ControlLog.writeLog("[ControlImportacionProductoML.resolverIndicesDeColumnas] Descubriendo " + strArrSplitString.Length.ToString() + " columnas ");
                foreach (string strColumn in strArrSplitString)
                {
                    dicIndices.Add(strColumn.Trim(), intIndiceColumna);
                    intIndiceColumna++;
                }

            }
            catch (Exception ex)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.resolverIndicesDeColumnas] Excepcion descubriendo indices: " + ex.Message);
                throw ex;
            }

            return dicIndices;
        }

        public static Dictionary<string, int> resolverIndicesDeColumnas(IRow objFilaHeaderParam)
        {
            Dictionary<string, int> dicIndices = new Dictionary<string, int>();
            try
            {
                int intIndiceColumna = 0;
                ControlLog.writeLog("[ControlImportacionProductoML.resolverIndicesDeColumnas] Descubriendo " + objFilaHeaderParam.Cells.Count.ToString() + " columnas ");
                for (int intColumnaHeader = objFilaHeaderParam.FirstCellNum; intColumnaHeader < objFilaHeaderParam.LastCellNum; intColumnaHeader++)
                {
                    string strCelda = objFilaHeaderParam.GetCell(intColumnaHeader).StringCellValue;
                    dicIndices.Add(objFilaHeaderParam.GetCell(intColumnaHeader).StringCellValue.Trim(), intIndiceColumna);
                    intIndiceColumna++;
                }

            }
            catch (Exception ex)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.resolverIndicesDeColumnas] Excepcion descubriendo indices: " + ex.Message);
                throw ex;
            }

            return dicIndices;
        }


        public static Dictionary<string, int> resolverIndicesDeColumnas(ExcelWorksheet objWorkSheet, int intFilaIndice)
        {
            Dictionary<string, int> dicIndices = new Dictionary<string, int>();
            try
            {
                int intIndiceColumna = 1;
                for (int intColumnaHeader = 1; intColumnaHeader < 100; intColumnaHeader++)
                {
                    if (objWorkSheet.Cell(intFilaIndice, intColumnaHeader) == null)
                    {
                        ControlLog.writeLog("[ControlImportacionProductoML.resolverIndicesDeColumnas] 1) Columnas descubiertas =" + intColumnaHeader.ToString());
                        break;
                    }
                    else if (objWorkSheet.Cell(intFilaIndice, intColumnaHeader).Value == String.Empty)
                    {
                        ControlLog.writeLog("[ControlImportacionProductoML.resolverIndicesDeColumnas] 2) Columnas descubiertas =" + intColumnaHeader.ToString());
                        break;
                    }
                    string strCelda = objWorkSheet.Cell(intFilaIndice, intColumnaHeader).Value;
                    dicIndices.Add(strCelda.Trim(), intIndiceColumna);
                    intIndiceColumna++;
                }

            }
            catch (Exception ex)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.resolverIndicesDeColumnas] Excepcion descubriendo indices: " + ex.Message);
                throw ex;
            }

            return dicIndices;
        }

        #region Convertir linea a producto
        public static ControlImportacionProductoML convertirLineaAProducto(string strCadenaParam, Dictionary<string, int> dicIndicesColumnas)
        {

            ControlImportacionProductoML objProducto = new ControlImportacionProductoML();
            string strHTMLDescription = String.Empty;

            if (strCadenaParam.Contains("<HTMLSTARTS>") && strCadenaParam.Contains("</HTMLSTARTS>"))
            {
                strHTMLDescription = strCadenaParam.Substring(strCadenaParam.IndexOf("<HTMLSTARTS>") + 12, strCadenaParam.IndexOf("</HTMLSTARTS>") - (strCadenaParam.IndexOf("<HTMLSTARTS>") + 12));
                strCadenaParam = strCadenaParam.Substring(0, strCadenaParam.IndexOf("<HTMLSTARTS>"));
            }

            string[] strArrSplitString = strCadenaParam.Split(new char[] { ';' });

            #region HTML Description
            try
            {

                if (strHTMLDescription != String.Empty)
                {
                    objProducto.HtmlDescription = strHTMLDescription;
                    objProducto.htmlMode = true;
                }
                else
                {
                    objProducto.HtmlDescription = "N/D";
                }                
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo HTML: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] HTML Description (" + objProducto.htmlMode.ToString() + ") =" + objProducto.HtmlDescription);
            #endregion
            #region Price
            try
            {
                objProducto.Price = strArrSplitString[dicIndicesColumnas["Price"]];
                objProducto.DoPriceProcess();
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Price: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Price: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Price =" + objProducto.Price);
            #endregion
            #region Title
            try
            {
                objProducto.Title = strArrSplitString[dicIndicesColumnas["Title"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Price: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Price: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Title =" + objProducto.Title);
            #endregion
            #region Header
            try
            {
                objProducto.Header = strArrSplitString[dicIndicesColumnas["Header"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Header: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Header: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Header =" + objProducto.Header);
            #endregion
            #region Features
            try
            {
                objProducto.Features = strArrSplitString[dicIndicesColumnas["Features"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Features: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Features: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Features =" + objProducto.Features);
            #endregion
            #region Specifications
            try
            {
                objProducto.Specifications = strArrSplitString[dicIndicesColumnas["Specifications"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Specifications: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Specifications: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Specification =" + objProducto.Specifications);
            #endregion
            #region Bottom
            try
            {
                objProducto.Bottom = strArrSplitString[dicIndicesColumnas["Bottom"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Bottom: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Bottom: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Bottom =" + objProducto.Bottom);
            #endregion
            #region Images
            try
            {
                objProducto.Images = strArrSplitString[dicIndicesColumnas["Images"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Images: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Images: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Images =" + objProducto.Images);
            #endregion
            #region Description
            try
            {
                objProducto.Description = strArrSplitString[dicIndicesColumnas["Description"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Description: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Description: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Description =" + objProducto.Description);
            #endregion
            #region Features
            try
            {
                objProducto.Features = strArrSplitString[dicIndicesColumnas["Features"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Features: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Features: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Features =" + objProducto.Features);
            #endregion
            #region Specifications
            try
            {
                objProducto.Specifications = strArrSplitString[dicIndicesColumnas["Specifications"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Specifications: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Specifications: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Specifications =" + objProducto.Specifications);
            #endregion
            #region Bottom
            try
            {
                objProducto.Bottom = strArrSplitString[dicIndicesColumnas["Bottom"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Bottom: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Bottom: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Bottom =" + objProducto.Bottom);
            #endregion
            #region Images
            try
            {
                objProducto.Images = strArrSplitString[dicIndicesColumnas["Images"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Images: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Images: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Images =" + objProducto.Images);
            #endregion
            #region Marquee 1
            try
            {
                objProducto.Marquee_1 = strArrSplitString[dicIndicesColumnas["Marquee 1"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 1: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 1: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 1 =" + objProducto.Marquee_1);
            #endregion
            #region Marquee 2
            try
            {
                objProducto.Marquee_2 = strArrSplitString[dicIndicesColumnas["Marquee 2"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 2: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 2: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 2 =" + objProducto.Marquee_2);
            #endregion
            #region Marquee 3
            try
            {
                objProducto.Marquee_3 = strArrSplitString[dicIndicesColumnas["Marquee 3"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 3: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 3: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 3 =" + objProducto.Marquee_3);
            #endregion
            #region Marquee 4
            try
            {
                objProducto.Marquee_4 = strArrSplitString[dicIndicesColumnas["Marquee 4"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 4: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 4: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 4 =" + objProducto.Marquee_4);
            #endregion
            #region Marquee 5
            try
            {
                objProducto.Marquee_5 = strArrSplitString[dicIndicesColumnas["Marquee 5"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 5: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 5: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 5 =" + objProducto.Marquee_5);
            #endregion
            #region Marquee 6
            try
            {
                objProducto.Marquee_6 = strArrSplitString[dicIndicesColumnas["Marquee 6"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 6: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 6: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 6 =" + objProducto.Marquee_6);
            #endregion
            #region Marquee 7
            try
            {
                objProducto.Marquee_7 = strArrSplitString[dicIndicesColumnas["Marquee 7"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 7: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 7: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 7 =" + objProducto.Marquee_7);
            #endregion
            #region Marquee 8
            try
            {
                objProducto.Marquee_8 = strArrSplitString[dicIndicesColumnas["Marquee 8"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 8: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 8: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 8 =" + objProducto.Marquee_8);
            #endregion
            #region Marquee 9
            try
            {
                objProducto.Marquee_9 = strArrSplitString[dicIndicesColumnas["Marquee 9"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 9: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 9: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 9 =" + objProducto.Marquee_9);
            #endregion
            #region Marquee 10
            try
            {
                objProducto.Marquee_10 = strArrSplitString[dicIndicesColumnas["Marquee 10"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 10: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 10: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 10 =" + objProducto.Marquee_10);
            #endregion
            #region Text1
            try
            {
                objProducto.Text_1 = strArrSplitString[dicIndicesColumnas["Text1"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Text1: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Text1: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Text1 =" + objProducto.Text_1);
            #endregion
            #region Text2
            try
            {
                objProducto.Text_2 = strArrSplitString[dicIndicesColumnas["Text2"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Text2: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Text2: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Text2 =" + objProducto.Text_2);
            #endregion
            #region Text3
            try
            {
                objProducto.Text_3 = strArrSplitString[dicIndicesColumnas["Text3"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Text3: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Text3: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Text3 =" + objProducto.Text_3);
            #endregion
            #region Subtitle
            try
            {
                objProducto.Subtitle = strArrSplitString[dicIndicesColumnas["Subtitle"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Subtitle: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Subtitle: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Subtitle =" + objProducto.Subtitle);
            #endregion
            #region Quantity
            try
            {
                objProducto.Quantity = strArrSplitString[dicIndicesColumnas["Quantity"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Quantity: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Quantity: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Quantity =" + objProducto.Quantity);
            #endregion
            #region Moneda
            try
            {
                objProducto.setCurrency(strArrSplitString[dicIndicesColumnas["Moneda"]]); //PABLO: Con este método se asigna el enum correspondiente. El default será "USD"
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Moneda: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Moneda: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Moneda =" + objProducto.getCurrency());
            #endregion
            #region Categoria
            try
            {
                objProducto.Categoria = strArrSplitString[dicIndicesColumnas["Categoria"]]; //HZ v2.0.4.4
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Categoria: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Categoria: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Categoria =" + objProducto.Categoria);
            #endregion
            #region DescriptionTitle
            try
            {
                objProducto.DescriptionTitle = strArrSplitString[dicIndicesColumnas["DescriptionTitle"]]; //HZ v2.0.4.4
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo DescriptionTitle: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo DescriptionTitle: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] DescriptionTitle =" + objProducto.DescriptionTitle);
            #endregion
            #region FeatureTitle
            try
            {
                objProducto.FeatureTitle = strArrSplitString[dicIndicesColumnas["FeatureTitle"]]; //HZ v2.0.4.4
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo FeatureTitle: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo FeatureTitle: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] FeatureTitle =" + objProducto.FeatureTitle);
            #endregion
            #region SpecificationTitle
            try
            {
                objProducto.SpecificationsTitle = strArrSplitString[dicIndicesColumnas["SpecificationTitle"]]; //HZ v2.0.4.4
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo SpecificationTitle: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo SpecificationTitle: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] SpecificationTitle =" + objProducto.SpecificationsTitle);
            #endregion
            #region YouTube
            try
            {
                objProducto.VideoLinkYouTube = strArrSplitString[dicIndicesColumnas["YouTube"]]; //HZ v2.0.4.4
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo YouTube: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo YouTube: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] YouTube =" + objProducto.VideoLinkYouTube);
            #endregion
            #region Condition(N/U)
            try
            {
                objProducto.Condicion = strArrSplitString[dicIndicesColumnas["Condition(N/U)"]];
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Condition(N/U): " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Condition(N/U): " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Condition(N/U) =" + objProducto.Condicion);
            #endregion

            return objProducto;

        }


        public static ControlImportacionProductoML convertirLineaAProducto(IRow objFilaParam, Dictionary<string, int> dicIndicesColumnas)
        {

            ControlImportacionProductoML objProducto = new ControlImportacionProductoML();

            #region HTML
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["HTML"]).SetCellType(CellType.STRING);
                objProducto.HtmlDescription = objFilaParam.GetCell(dicIndicesColumnas["HTML"]).StringCellValue;
                if (objProducto.HtmlDescription != "N/D")
                {
                    if (objProducto.HtmlDescription.Contains("<HTMLSTARTS>") && objProducto.HtmlDescription.Contains("</HTMLSTARTS>"))
                    {
                        objProducto.htmlMode = true;
                        objProducto.HtmlDescription = objProducto.HtmlDescription.Substring(12, objProducto.HtmlDescription.IndexOf("</HTMLSTARTS>") - 12);
                    }
                    else
                    {
                        objProducto.HtmlDescription = "N/D";
                    }

                }
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo HTML: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo HTML: " + innerEx.Message);

            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] HTML Description (" + objProducto.htmlMode.ToString() + ") =" + objProducto.HtmlDescription);
            #endregion
            #region Price
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Price"]).SetCellType(CellType.STRING);
                objProducto.Price = objFilaParam.GetCell(dicIndicesColumnas["Price"]).StringCellValue;
                objProducto.DoPriceProcess();

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Price: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Price: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Price =" + objProducto.Price);
            #endregion
            #region Title
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Title"]).SetCellType(CellType.STRING);
                objProducto.Title = objFilaParam.GetCell(dicIndicesColumnas["Title"]).StringCellValue;

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Title: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Title: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Title =" + objProducto.Title);
            #endregion
            #region Header
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Header"]).SetCellType(CellType.STRING);
                objProducto.Header = objFilaParam.GetCell(dicIndicesColumnas["Header"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Header: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Header: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Header =" + objProducto.Header);
            #endregion
            #region Description
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Description"]).SetCellType(CellType.STRING);
                objProducto.Description = objFilaParam.GetCell(dicIndicesColumnas["Description"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Description: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Description: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Description =" + objProducto.Description);
            #endregion
            #region Features
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Features"]).SetCellType(CellType.STRING);
                objProducto.Features = objFilaParam.GetCell(dicIndicesColumnas["Features"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Features: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Features: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Features =" + objProducto.Features);
            #endregion
            #region Specifications
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Specifications"]).SetCellType(CellType.STRING);
                objProducto.Specifications = objFilaParam.GetCell(dicIndicesColumnas["Specifications"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Specifications: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Specifications: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Specifications =" + objProducto.Specifications);
            #endregion
            #region Bottom
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Bottom"]).SetCellType(CellType.STRING);
                objProducto.Bottom = objFilaParam.GetCell(dicIndicesColumnas["Bottom"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Bottom: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Bottom: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Bottom =" + objProducto.Bottom);
            #endregion
            #region Images
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Images"]).SetCellType(CellType.STRING);
                objProducto.Images = objFilaParam.GetCell(dicIndicesColumnas["Images"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Images: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Images: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Images =" + objProducto.Images);
            #endregion
            #region Marquee 1
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Marquee 1"]).SetCellType(CellType.STRING);
                objProducto.Marquee_1 = objFilaParam.GetCell(dicIndicesColumnas["Marquee 1"]).StringCellValue;

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 1: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 1: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 1 =" + objProducto.Marquee_1);
            #endregion
            #region Marquee 2
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Marquee 2"]).SetCellType(CellType.STRING);
                objProducto.Marquee_2 = objFilaParam.GetCell(dicIndicesColumnas["Marquee 2"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 2: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 2: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 2 =" + objProducto.Marquee_2);
            #endregion
            #region Marquee 3
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Marquee 3"]).SetCellType(CellType.STRING);
                objProducto.Marquee_3 = objFilaParam.GetCell(dicIndicesColumnas["Marquee 3"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 3: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 3: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 3 =" + objProducto.Marquee_3);
            #endregion
            #region Marquee 4
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Marquee 4"]).SetCellType(CellType.STRING);
                objProducto.Marquee_4 = objFilaParam.GetCell(dicIndicesColumnas["Marquee 4"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 4: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 4: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 4 =" + objProducto.Marquee_4);
            #endregion
            #region Marquee 5
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Marquee 5"]).SetCellType(CellType.STRING);
                objProducto.Marquee_5 = objFilaParam.GetCell(dicIndicesColumnas["Marquee 5"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 5: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 5: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 5 =" + objProducto.Marquee_5);
            #endregion
            #region Marquee 6
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Marquee 6"]).SetCellType(CellType.STRING);
                objProducto.Marquee_6 = objFilaParam.GetCell(dicIndicesColumnas["Marquee 6"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 6: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 6: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 6 =" + objProducto.Marquee_6);
            #endregion
            #region Marquee 7
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Marquee 7"]).SetCellType(CellType.STRING);
                objProducto.Marquee_7 = objFilaParam.GetCell(dicIndicesColumnas["Marquee 7"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 7: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 7: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 7 =" + objProducto.Marquee_7);
            #endregion
            #region Marquee 8
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Marquee 8"]).SetCellType(CellType.STRING);
                objProducto.Marquee_8 = objFilaParam.GetCell(dicIndicesColumnas["Marquee 8"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 8: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 8: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 8 =" + objProducto.Marquee_8);
            #endregion
            #region Marquee 9
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Marquee 9"]).SetCellType(CellType.STRING);
                objProducto.Marquee_9 = objFilaParam.GetCell(dicIndicesColumnas["Marquee 9"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 9: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 9: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 9 =" + objProducto.Marquee_9);
            #endregion
            #region Marquee 10
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Marquee 10"]).SetCellType(CellType.STRING);
                objProducto.Marquee_10 = objFilaParam.GetCell(dicIndicesColumnas["Marquee 10"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 10: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 10: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 10 =" + objProducto.Marquee_10);
            #endregion
            #region Text1
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Text1"]).SetCellType(CellType.STRING);
                objProducto.Text_1 = objFilaParam.GetCell(dicIndicesColumnas["Text1"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Text1: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Text1: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Text1 =" + objProducto.Text_1);
            #endregion
            #region Text2
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Text2"]).SetCellType(CellType.STRING);
                objProducto.Text_2 = objFilaParam.GetCell(dicIndicesColumnas["Text2"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Text2: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Text2: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Text2 =" + objProducto.Text_2);
            #endregion
            #region Text3
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Text3"]).SetCellType(CellType.STRING);
                objProducto.Text_3 = objFilaParam.GetCell(dicIndicesColumnas["Text3"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Text3: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Text3: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Text3 =" + objProducto.Text_3);
            #endregion
            #region Subtitle
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Subtitle"]).SetCellType(CellType.STRING);
                objProducto.Subtitle = objFilaParam.GetCell(dicIndicesColumnas["Subtitle"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Subtitle: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Subtitle: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Subtitle =" + objProducto.Subtitle);
            #endregion
            #region Quantity
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Quantity"]).SetCellType(CellType.STRING);
                objProducto.Quantity = objFilaParam.GetCell(dicIndicesColumnas["Quantity"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Quantity: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Quantity: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Quantity =" + objProducto.Quantity);
            #endregion
            #region Moneda
            try
            {

                objFilaParam.GetCell(dicIndicesColumnas["Moneda"]).SetCellType(CellType.STRING);
                objProducto.setCurrency(objFilaParam.GetCell(dicIndicesColumnas["Moneda"]).StringCellValue);
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Moneda: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Moneda: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Moneda =" + objProducto.getCurrency());
            #endregion
            #region Categoria
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Categoria"]).SetCellType(CellType.STRING);
                objProducto.Categoria = objFilaParam.GetCell(dicIndicesColumnas["Categoria"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Categoria: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Categoria: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Categoria =" + objProducto.Categoria);
            #endregion
            #region DescriptionTitle
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["DescriptionTitle"]).SetCellType(CellType.STRING);
                objProducto.DescriptionTitle = objFilaParam.GetCell(dicIndicesColumnas["DescriptionTitle"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo DescriptionTitle: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo DescriptionTitle: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] DescriptionTitle =" + objProducto.DescriptionTitle);
            #endregion
            #region FeatureTitle
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["FeatureTitle"]).SetCellType(CellType.STRING);
                objProducto.FeatureTitle = objFilaParam.GetCell(dicIndicesColumnas["FeatureTitle"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo FeatureTitle: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo FeatureTitle: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] FeatureTitle =" + objProducto.FeatureTitle);
            #endregion
            #region SpecificationTitle
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["SpecificationTitle"]).SetCellType(CellType.STRING);
                objProducto.SpecificationsTitle = objFilaParam.GetCell(dicIndicesColumnas["SpecificationTitle"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo SpecificationTitle: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo SpecificationTitle: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] SpecificationTitle =" + objProducto.SpecificationsTitle);
            #endregion
            #region YouTube
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["YouTube"]).SetCellType(CellType.STRING);
                objProducto.VideoLinkYouTube = objFilaParam.GetCell(dicIndicesColumnas["YouTube"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo YouTube: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo YouTube: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] YouTube =" + objProducto.VideoLinkYouTube);
            #endregion
            #region Condition(N/U)
            try
            {
                objFilaParam.GetCell(dicIndicesColumnas["Condition(N/U)"]).SetCellType(CellType.STRING);
                objProducto.Condicion = objFilaParam.GetCell(dicIndicesColumnas["Condition(N/U)"]).StringCellValue;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Condition(N/U): " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Condition(N/U): " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Condition(N/U) =" + objProducto.Condicion);
            #endregion

            return objProducto;
        }

        public static ControlImportacionProductoML convertirLineaAProducto(ExcelWorksheet objWorkSheet, int intFilaIndice, Dictionary<string, int> dicIndicesColumnas)
        {
            ControlImportacionProductoML objProducto = new ControlImportacionProductoML();


            #region HTML
            try
            {
                objProducto.HtmlDescription = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["HTML"]).Value;
                if (objProducto.HtmlDescription != "N/D")
                {
                    if (objProducto.HtmlDescription.Contains("<HTMLSTARTS>") && objProducto.HtmlDescription.Contains("</HTMLSTARTS>"))
                    {
                        objProducto.htmlMode = true;
                        objProducto.HtmlDescription = objProducto.HtmlDescription.Substring(12, objProducto.HtmlDescription.IndexOf("</HTMLSTARTS>") - 12);
                    }
                    else
                    {
                        objProducto.HtmlDescription = "N/D";
                    }


                }
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo HTML: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo HTML: " + innerEx.Message);
            }

            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] HTML Description (" + objProducto.htmlMode.ToString() + ") =" + objProducto.HtmlDescription);
            #endregion
            #region Price
            try
            {

                objProducto.Price = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Price"]).Value;
                objProducto.DoPriceProcess();

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Price: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Price: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Price =" + objProducto.Price);
            #endregion
            #region Title
            try
            {

                objProducto.Title = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Title"]).Value;

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Title: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Title: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Title =" + objProducto.Title);
            #endregion
            #region Header
            try
            {
                objProducto.Header = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Header"]).Value;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Header: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Header: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Header =" + objProducto.Header);
            #endregion
            #region Description
            try
            {
                objProducto.Description = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Description"]).Value;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Description: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Description: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Description =" + objProducto.Description);
            #endregion
            #region Features
            try
            {
                objProducto.Features = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Features"]).Value;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Features: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Features: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Features =" + objProducto.Features);
            #endregion
            #region Specifications
            try
            {
                objProducto.Specifications = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Specifications"]).Value;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Specifications: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Specifications: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Specifications =" + objProducto.Specifications);
            #endregion
            #region Bottom
            try
            {
                objProducto.Bottom = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Bottom"]).Value;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Bottom: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Bottom: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Bottom =" + objProducto.Bottom);
            #endregion
            #region Images
            try
            {
                objProducto.Images = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Images"]).Value;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Images: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Images: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Images =" + objProducto.Images);
            #endregion
            #region Marquee 1
            try
            {
                objProducto.Marquee_1 = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Marquee 1"]).Value;

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 1: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 1: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 1 =" + objProducto.Marquee_1);
            #endregion
            #region Marquee 2
            try
            {
                objProducto.Marquee_2 = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Marquee 2"]).Value;

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 2: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 2: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 2 =" + objProducto.Marquee_2);
            #endregion
            #region Marquee 3
            try
            {
                objProducto.Marquee_3 = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Marquee 3"]).Value;

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 3: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 3: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 3 =" + objProducto.Marquee_3);
            #endregion
            #region Marquee 4
            try
            {
                objProducto.Marquee_4 = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Marquee 4"]).Value;

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 4: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 4: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 4 =" + objProducto.Marquee_4);
            #endregion
            #region Marquee 5
            try
            {
                objProducto.Marquee_5 = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Marquee 5"]).Value;

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 5: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 5: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 5 =" + objProducto.Marquee_5);
            #endregion
            #region Marquee 6
            try
            {
                objProducto.Marquee_6 = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Marquee 6"]).Value;

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 6: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 6: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 6 =" + objProducto.Marquee_6);
            #endregion
            #region Marquee 7
            try
            {
                objProducto.Marquee_7 = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Marquee 7"]).Value;

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 7: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 7: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 7 =" + objProducto.Marquee_7);
            #endregion
            #region Marquee 8
            try
            {
                objProducto.Marquee_8 = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Marquee 8"]).Value;

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 8: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 8: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 8 =" + objProducto.Marquee_8);
            #endregion
            #region Marquee 9
            try
            {
                objProducto.Marquee_9 = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Marquee 9"]).Value;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 9: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 9: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 9 =" + objProducto.Marquee_9);
            #endregion
            #region Marquee 10
            try
            {
                objProducto.Marquee_10 = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Marquee 10"]).Value;

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Marquee 10: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Marquee 10: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Marquee 10 =" + objProducto.Marquee_10);
            #endregion
            #region Text1
            try
            {
                objProducto.Text_1 = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Text1"]).Value;

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Text1: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Text1: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Text1 =" + objProducto.Text_1);
            #endregion
            #region Text2
            try
            {
                objProducto.Text_2 = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Text2"]).Value;

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Text2: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Text2: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Text2 =" + objProducto.Text_2);
            #endregion
            #region Text3
            try
            {
                objProducto.Text_3 = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Text3"]).Value;

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Text3: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Text3: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Text3 =" + objProducto.Text_3);
            #endregion
            #region Subtitle
            try
            {
                objProducto.Subtitle = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Subtitle"]).Value;

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Subtitle: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Subtitle: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Subtitle =" + objProducto.Subtitle);
            #endregion
            #region Quantity
            try
            {
                objProducto.Quantity = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Quantity"]).Value;

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Quantity: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Quantity: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Quantity =" + objProducto.Quantity);
            #endregion
            #region Moneda
            try
            {

                objProducto.setCurrency(objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Moneda"]).Value);

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Moneda: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Moneda: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Moneda =" + objProducto.getCurrency());
            #endregion
            #region Categoria
            try
            {
                objProducto.Categoria = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Categoria"]).Value;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Categoria: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Categoria: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Categoria =" + objProducto.Categoria);
            #endregion
            #region DescriptionTitle
            try
            {
                objProducto.DescriptionTitle = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["DescriptionTitle"]).Value;

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo DescriptionTitle: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo DescriptionTitle: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] DescriptionTitle =" + objProducto.DescriptionTitle);
            #endregion
            #region FeatureTitle
            try
            {
                objProducto.FeatureTitle = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["FeatureTitle"]).Value;

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo FeatureTitle: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo FeatureTitle: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] FeatureTitle =" + objProducto.FeatureTitle);
            #endregion
            #region SpecificationTitle
            try
            {
                objProducto.SpecificationsTitle = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["SpecificationTitle"]).Value;

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo SpecificationTitle: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo SpecificationTitle: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] SpecificationTitle =" + objProducto.SpecificationsTitle);
            #endregion
            #region YouTube
            try
            {

                objProducto.VideoLinkYouTube = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["YouTube"]).Value;

            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo YouTube: " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo YouTube: " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] YouTube =" + objProducto.VideoLinkYouTube);
            #endregion
            #region Condition(N/U)
            try
            {
                objProducto.Condicion = objWorkSheet.Cell(intFilaIndice, dicIndicesColumnas["Condition(N/U)"]).Value;
            }
            catch (Exception innerEx)
            {
                ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] EXCEPCION levantando campo Condition(N/U): " + innerEx.Message);
                throw new ImportacionException("EXCEPCION levantando campo Condition(N/U): " + innerEx.Message);
            }
            ControlLog.writeLog("[ControlImportacionProductoML.convertirLineaAProducto] Condition(N/U) =" + objProducto.Condicion);
            #endregion

            return objProducto;

        }
        #endregion

        public string obtenerConsultaDeActualizacionParaDatosSecundarios()
        {
            string strQuery = "";

            if (this.Header != String.Empty)
            {
                strQuery += "Header='" + this.Header.Replace("'","\"") + "',";
            }
            if (this.Description != String.Empty)
            {
				strQuery += "Description='" + this.Description.Replace("'", "\"") + "',";
            }
            if (this.Features != String.Empty)
            {
				strQuery += "Features='" + this.Features.Replace("'", "\"") + "',";
            }
            if (this.Specifications != String.Empty)
            {
				strQuery += "Specifications='" + this.Specifications.Replace("'", "\"") + "',";
            }
            if (this.Bottom != String.Empty)
            {
				strQuery += "Bottom='" + this.Bottom.Replace("'", "\"") + "',";
            }
            if (this.Marquee_1 != String.Empty)
            {
				strQuery += "Marquee1='" + this.Marquee_1.Replace("'", "\"") + "',";
            }
            if (this.Marquee_2 != String.Empty)
            {
				strQuery += "Marquee2='" + this.Marquee_2.Replace("'", "\"") + "',";
            }
            if (this.Marquee_3 != String.Empty)
            {
				strQuery += "Marquee3='" + this.Marquee_3.Replace("'", "\"") + "',";
            }
            if (this.Marquee_4 != String.Empty)
            {
				strQuery += "Marquee4='" + this.Marquee_4.Replace("'", "\"") + "',";
            }
            if (this.Marquee_5 != String.Empty)
            {
				strQuery += "Marquee5='" + this.Marquee_5.Replace("'", "\"") + "',";
            }
            if (this.Marquee_6 != String.Empty)
            {
				strQuery += "Marquee6='" + this.Marquee_6.Replace("'", "\"") + "',";
            }
            if (this.Marquee_7 != String.Empty)
            {
				strQuery += "Marquee7='" + this.Marquee_7.Replace("'", "\"") + "',";
            }
            if (this.Marquee_8 != String.Empty)
            {
				strQuery += "Marquee8='" + this.Marquee_8.Replace("'", "\"") + "',";
            }
            if (this.Marquee_9 != String.Empty)
            {
				strQuery += "Marquee9='" + this.Marquee_9.Replace("'", "\"") + "',";
            }
            if (this.Marquee_10 != String.Empty)
            {
				strQuery += "Marquee10='" + this.Marquee_10.Replace("'", "\"") + "',";
            }
            if (this.Text_1 != String.Empty)
            {
				strQuery += "Text1='" + this.Text_1.Replace("'", "\"") + "',";
            }
            if (this.Text_2 != String.Empty)
            {
				strQuery += "Text2='" + this.Text_2.Replace("'", "\"") + "',";
            }
            if (this.Text_3 != String.Empty)
            {
				strQuery += "Text3='" + this.Text_3.Replace("'", "\"") + "',";
            }
            if (this.descriptionTitle != String.Empty)
            {
				strQuery += "DescripcionTitle='" + this.descriptionTitle.Replace("'", "\"") + "',";
            }
            if (this.featureTitle != String.Empty)
            {
				strQuery += "FeatureTitle='" + this.featureTitle.Replace("'", "\"") + "',";
            }
            if (this.specificationsTitle != String.Empty)
            {
				strQuery += "CaracteristicasTitle='" + this.specificationsTitle.Replace("'", "\"") + "',";
            }
            if (this.specificationsTitle != String.Empty)
            {
				strQuery += "LinkVideoYouTube='" + this.videoLinkYouTube.Replace("'", "\"") + "',";
            }
            if (this.condition != String.Empty)
            {
				strQuery += "Condition='" + this.condition.Replace("'", "\"") + "',";
            }
            if (this.htmlDescription != String.Empty)
            {
				strQuery += "HTML='" + this.htmlDescription.Replace("'", "\"") + "',";
            }
            return strQuery.Substring(0, strQuery.Length - 1);
        }

        public void agregarImagenErronea(string strLinkImage)
        {
            ControlImportacionProductoMLImagen objImagenErronea = new ControlImportacionProductoMLImagen();
            objImagenErronea.strLinkImagen = strLinkImage;
            lstImagenErroneas.Add(objImagenErronea);


            try
            {
                foreach (ControlImportacionProductoMLImagen objImagen in lstImagen)
                {
                    if (objImagen.strLinkImagen == strLinkImage)
                    {
                        lstImagen.RemoveAt(lstImagen.LastIndexOf(objImagen));
                        break;
                    }
                }


            }
            catch (Exception ex)
            {
                ControlLog.writeLog("[agregarImagenErronea] Excepcion sacando de la lista de imagenes buenas. Mensaje: " + ex.Message);
                throw ex;
            }
        }

        public override string ToString()
        {

            //   ControlLog.writeLog("[ToString] Antes: " + this.htmlDescription);
            //   ControlLog.writeLog("[ToString] Despues: " + this.htmlDescription.Replace("\"\"", "\""));

            return "<tr valign=\"Top\"><td><h3 style=\"color:Blue;\">" +
                    " ID: " + this.intIdPublicacion.ToString() + " - " + this.title +
                   "</h3></td>" +
                    "<td>" +
                    this.subtitle +
                   "</td>" +
                   "<td>" +
                    this.header +
                   "</td>" +
                   "<td>" +
                    this.getCurrency() +
                    this.price +
                   "</td>" +
                    "<td>" +
                    this.quantity +
                   "</td>" +
                    "<td>" +
                    this.categoria +
                   "</td>" +
                    "<td>" +
                    this.videoLinkYouTube +
                   "</td>" +
                   "<td>" +
                    this.descriptionTitle + ":" + this.description +
                   "</td>" +
                   "<td>" +
                    this.specificationsTitle + ":" + this.specifications +
                   "</td>" +
                   "<td>" +
                    this.featureTitle + ":" + this.features +
                   "</td>" +
                   "<td>" +
                    this.bottom +
                   "</td>" +
                   "<td>" +
                    "Imagenes cargadas: " + this.imprimirHtmlImagenesOk() + " <b style=\"color:red\">Imagenes que fallaron " + this.imprimirHtmlImagenesKo() + "</b>" +
                   "</td>" +
                    "<td>" +
                    this.marquee_1 +
                   "</td>" +
                    "<td>" +
                    this.marquee_2 +
                   "</td>" +
                    "<td>" +
                    this.marquee_3 +
                   "</td>" +
                    "<td>" +
                    this.marquee_4 +
                   "</td>" +
                    "<td>" +
                    this.marquee_5 +
                   "</td>" +
                    "<td>" +
                    this.marquee_6 +
                   "</td>" +
                    "<td>" +
                    this.marquee_7 +
                   "</td>" +
                    "<td>" +
                    this.marquee_8 +
                   "</td>" +
                    "<td>" +
                    this.marquee_9 +
                   "</td>" +
                    "<td>" +
                    this.marquee_10 +
                   "</td>" +
                    "<td>" +
                    this.text_1 +
                   "</td>" +
                    "<td>" +
                    this.text_2 +
                   "</td>" +
                    "<td>" +
                    this.text_3 +
                   "</td>" +
                    "<td>" +
                    this.condition +
                   "</td>" +
                   "<td>" +
                   this.htmlDescription.Replace("\"\"", "\"") +
                   "</td></tr>";



        }

        private string imprimirHtmlImagenesKo()
        {
            string strResult = "<br/>";
            if (lstImagenErroneas.Count == 0)
            {
                strResult += "<b>No hay imagenes con errores</b><br/>";
            }
            else foreach (ControlImportacionProductoMLImagen objImagen in lstImagenErroneas)
                {
                    strResult += objImagen.ToString() + "<br/>";
                }
            return strResult;
        }

        private string imprimirHtmlImagenesOk()
        {
            string strResult = "<br/>";
            if (lstImagen.Count == 0)
            {
                strResult += "<b>No hay imagenes subidas OK</b><br/>";
            }
            else foreach (ControlImportacionProductoMLImagen objImagen in lstImagen)
                {
                    strResult += objImagen.ToString() + "<br/>";
                }
            return strResult;
        }


    }
}
public class ControlImportacionProductoMLImagen
{
    public string strLinkImagen;
    public string strLinkImagenLocal;

    public override string ToString()
    {
        if (strLinkImagenLocal == null)
        {
            return "<b>URL:</b>" + strLinkImagen;
        }
        else
        {
            return "<b>URL:</b> " + strLinkImagen + "<br/><b>Path Local: </b>" + strLinkImagenLocal;
        }
    }
}
